package com.cn.mapper;

import com.cn.pojo.User;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

public interface UserMapper {
    /**
     * 5.2.1 <if>
     * 如果if标签test属性的值为true,则执行if标签下的sql语句
     * 注意：在test属性的值中不必再使用占位符#{参数名}的形式获取参数值，直接使用参数名获取对应的参数值即可
     */
    List<User> queryUserWithIf(@Param("username") String username, @Param("password") String password);

    /**
     * 5.2.2 where标签
     * 功能：
     * 1. 如果<if></if>满足条件,那么where标签将自动添加where关键字，并自动删除查询条件中最前方多余的and或or关键字
     * 2. 如果if不满足条件，那么where标签失效而且不添加and或or关键字
     * 3. 如果没有where子句，则不生成where关键字
      */
    List<User> queryUserWithWhere(@Param("username") String username, @Param("password") String password);

    /**
     * 5.2.3 choose、when、otherwise
     * 功能：实现多分支选择
     */
    List<User> queryUserWithChoose(@Param("username") String username, @Param("password") String password);

    /**
     * 5.2.4 <set>
     * set标签结合if标签一起使用，用于管理映射文件中<update>语句的set子句，其主要作用如下:
     * 1. 如果if标签满足条件，那么set标签将自动添加set关键字
     * 2. 如果if标签不满足条件，那么set标签失效而且不添加set关键字
     * 3. 删除set子句中多余的逗号
     */
    int updateUserWithSet(User user);

    /**
     * 5.2.5 trim标签
     * 功能：trim标签常用于在SQL语句前后添加或删除一些内容。
     * prefix 属性：用于在sql语句前添加内容
     * suffix 属性：用于在sql语句后添加内容
     * prefixOverrides 属性：用于删除sql语句开头的部分
     * suffixOverrides 属性：用于删除sql语句多余的关键字或字符
     */
    int updateUserWithTrim(User user);

    /**
     * 5.2.6 bind标签
     * bind标签用于数据绑定，常用于模糊查询
     */
    List<User> queryUserWithBind(@Param("username") String username);

    /**
     * 5.2.7 foreach
     * foreach标签用于在SQL语句中遍历列表、数组、Map等集合。除此以外，该标签还常用于SQL中的in查询。
     * foreach标签的常用属性及其作用:
     * 1.collection 待遍历的集合
     * 2. item 集合中被遍历的当前对象
     * 3. index 当集合为列表和数组时，index是对象的索引。当集合是Map时，index是Map的键
     * 4. open 表示开始符号，其常用值为"("
     * 5. close 表示结束符号，其常用值为","
     * 6. separator 表示个元素之间的分隔符，其常用值为","
     */
    List<User> queryUserWithForeach1(@Param("userIDList") List<Integer> userIDList);
    List<User> queryUserWithForeach2(@Param("userIDArray") int[] userIDArray);
    List<User> queryUserWithForeach3(@Param("userMap") Map<String,Object> userMap);

    /**
     * 5.2.8 sql标签
     * 功能：sql标签用于定义SQL语句片段，该标签的常用属性为id,通过include标签引用
     * 5.2.9 include标签
     * 功能：include标签常与sql标签配合使用,引用已经定义的sql片段，用refid属性引用sql标签的id属性
     */
    List<User> queryUserWithInclude(@Param("username") String username, @Param("password") String password);
}
